/**
 * for(i->n)
 *  for(j=m->v)
 *    f[j] = max{f[j],f[j-v[0]]+w[0],f[j-v[1]]+w[1]...}
 * 
 * 多重背包是分组背包的一个特殊情况，将多重背包问题中s件看做s组，每组一个
*/

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 110;
int n,m;
int f[N],v[N],w[N];
int main()
{
    cin >> n >> m;
    for(int i = 0;i < n; ++i)
    {
        int s;
        cin >> s;
        for(int j = 0;j < s; ++j) cin >> v[j] >> w[j];
        for(int j = m; j >= 0;--j)
        {
            for(int k = 0;k < s;++k)
            {
                if(j >= v[k])
                    f[j] = max(f[j],f[j-v[k]] + w[k]);
            }             
        }
    }
    cout << f[m] << endl;
    return 0;
}